Merged [21029]: nl updates
[adiumx.git] / Plugins / WebKit Message View / AIWebKitDelegate.m
blob95405cea88a8dbf90c1ef4e7745a6577fb37a168
1 //
2 //  AIWebKitDelegate.m
3 //  Adium
4 //
5 //  Created by David Smith on 5/9/07.
6 //  Copyright 2007 __MyCompanyName__. All rights reserved.
7 //
9 #import "AIWebKitDelegate.h"
10 #import "AIWebKitMessageViewController.h"
11 #import "ESWebView.h"
13 static AIWebKitDelegate *AISharedWebKitDelegate;
15 @implementation AIWebKitDelegate
17 - (id) init 
19         if((self = [super init])) 
20         {
21                 mapping = [[NSMutableDictionary alloc] init];
22         }
23         return self;
26 + (AIWebKitDelegate *)sharedWebKitDelegate
28         if(!AISharedWebKitDelegate)
29                 AISharedWebKitDelegate = [[self alloc] init];
30         return AISharedWebKitDelegate;
33 - (void) addDelegate:(AIWebKitMessageViewController *)controller forView:(ESWebView *)webView
35         [mapping setObject:controller forKey:[NSValue valueWithPointer:webView]];
36         
37         [webView setFrameLoadDelegate:self];
38         [webView setPolicyDelegate:self];
39         [webView setUIDelegate:self];
40         [webView setDraggingDelegate:self];
41         
42 //      [[webView windowScriptObject] setValue:self forKey:@"client"];
44 - (void) removeDelegate:(AIWebKitMessageViewController *)controller
46         ESWebView *webView = (ESWebView *)[controller messageView];
47         
48         [webView setFrameLoadDelegate:nil];
49         [webView setPolicyDelegate:nil];
50         [webView setUIDelegate:nil];
51         [webView setDraggingDelegate:nil];
52         
53         [mapping removeObjectForKey:[NSValue valueWithPointer:webView]];
56 //WebView Delegates ----------------------------------------------------------------------------------------------------
57 #pragma mark Webview delegates
58 /*!
59 * @brief Invoked once the webview has loaded and is ready to accept content
60  */
61 - (void)webView:(ESWebView *)sender didFinishLoadForFrame:(WebFrame *)frame
63         AIWebKitMessageViewController *controller = [mapping objectForKey:[NSValue valueWithPointer:sender]];
64         if(controller) {
65                 //Flag the view as ready (as soon as the current methods exit) so we know it's now safe to add content
66                 [controller performSelector:@selector(webViewIsReady) withObject:nil afterDelay:0.00001];
67         }
68         
69         //We don't care about any further didFinishLoad notifications
70         [sender setFrameLoadDelegate:nil];
73 /*!
74 * @brief Prevent the webview from following external links.  We direct these to the user's web browser.
75  */
76 - (void)webView:(ESWebView *)sender
77     decidePolicyForNavigationAction:(NSDictionary *)actionInformation
78                 request:(NSURLRequest *)request
79                   frame:(WebFrame *)frame
80     decisionListener:(id<WebPolicyDecisionListener>)listener
82     int actionKey = [[actionInformation objectForKey: WebActionNavigationTypeKey] intValue];
83     if (actionKey == WebNavigationTypeOther) {
84                 [listener use];
85     } else {
86                 NSURL *url = [actionInformation objectForKey:WebActionOriginalURLKey];
87                 
88                 //Ignore file URLs, but open anything else
89                 if (![url isFileURL]) {
90                         [[NSWorkspace sharedWorkspace] openURL:url];
91                 }
92                 
93                 [listener ignore];
94     }
97 /*!
98 * @brief Append our own menu items to the webview's contextual menus
99  */
100 - (NSArray *)webView:(WebView *)sender contextMenuItemsForElement:(NSDictionary *)element defaultMenuItems:(NSArray *)defaultMenuItems
102         AIWebKitMessageViewController *controller = [mapping objectForKey:[NSValue valueWithPointer:sender]];
103         if(controller)
104                 return [controller webView:sender contextMenuItemsForElement:element defaultMenuItems:defaultMenuItems];
105         return defaultMenuItems;
109 * @brief Dragging entered
110  */
111 - (NSDragOperation)webView:(ESWebView *)sender draggingEntered:(id <NSDraggingInfo>)info
113         AIWebKitMessageViewController *controller = [mapping objectForKey:[NSValue valueWithPointer:sender]];
114         NSLog(@"%@", controller);
115         return controller ? [controller draggingEntered:info] : NSDragOperationNone;
119 * @brief Dragging updated
120  */
121 - (NSDragOperation)webView:(ESWebView *)sender draggingUpdated:(id <NSDraggingInfo>)info
123         AIWebKitMessageViewController *controller = [mapping objectForKey:[NSValue valueWithPointer:sender]];
124         return controller ? [controller draggingUpdated:info] : NSDragOperationNone;
128 * @brief Handle a drag onto the webview
129  * 
130  * If we're getting a non-image file, we can handle it immediately.  Otherwise, the drag is the textView's problem.
131  */
132 - (BOOL)webView:(ESWebView *)sender performDragOperation:(id <NSDraggingInfo>)info
134         AIWebKitMessageViewController *controller = [mapping objectForKey:[NSValue valueWithPointer:sender]];
135         return controller ? [controller performDragOperation:info] : NO;
139 * @brief Pass on the prepareForDragOperation if it's not one we're handling in this class
140  */
141 - (BOOL)webView:(ESWebView *)sender prepareForDragOperation:(id <NSDraggingInfo>)info
143         AIWebKitMessageViewController *controller = [mapping objectForKey:[NSValue valueWithPointer:sender]];
144         return controller ? [controller prepareForDragOperation:info] : NO;
148 * @brief Pass on the concludeDragOperation if it's not one we're handling in this class
149  */
150 - (void)webView:(ESWebView *)sender concludeDragOperation:(id <NSDraggingInfo>)info
152         AIWebKitMessageViewController *controller = [mapping objectForKey:[NSValue valueWithPointer:sender]];
153         if(controller)
154                 [controller concludeDragOperation:info];
157 - (BOOL)webView:(ESWebView *)sender shouldHandleDragWithPasteboard:(NSPasteboard *)pasteboard
159         //AIWebKitMessageViewController *controller = [mapping objectForKey:[NSValue valueWithPointer:sender]];
160         //return controller ? [controller shouldHandleDragWithPasteboard:pasteboard] : NO;
161         return NO;
164 @end